package com.iman.manjusri.service.impl;

import java.util.HashMap;
import java.util.Map;

import javax.inject.Inject;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.iman.common.util.ConfigUtil;
import com.iman.common.util.DateUtils;
import com.iman.common.util.EncryptTool;
import com.iman.common.util.JsonMapper;
import com.iman.common.util.MD5;
import com.iman.common.util.PaymentType;
import com.iman.common.util.PriceUtils;
import com.iman.manjusri.domain.User;
import com.iman.manjusri.mappers.DrmBuyOrderMapper;
import com.iman.manjusri.mappers.models.DrmBuyOrder;
import com.iman.manjusri.repository.IRedisGo;
import com.iman.manjusri.service.PaymentService;
import com.iman.manjusri.service.UserService;
import com.iman.manjusri.vo.pay.AliPayPramVo;

@Service
public class PaymentServiceImpl implements PaymentService{

	@Autowired
	IRedisGo redisGo;
	@Autowired
	DrmBuyOrderMapper drmBuyOrderMapper;
	@Inject 
	UserService userService;
	
	
	
	static String _NOTIFY_URL = "_NOTIFY_URL";
	static String _RETURN_URL = "_RETURN_URL";
	
	@Override
	public String comfirmPay(DrmBuyOrder order, PaymentType type) {
 
		//需要保持在 DrmPaySetting 表中使用更好
		String notifyUrl = ConfigUtil.getString( type.name()+_NOTIFY_URL ); 
		String returnUrl = ConfigUtil.getString( type.name()+_RETURN_URL ); 
	 
		
		String orderid = order.getOrderId();
		String token = MD5.digest(  orderid+ DateUtils.getCurrentStringDateYYMDHMSS()  );
		String mainkey = null;
		try {
			mainkey = EncryptTool.sha1HEX( orderid+token );
		} catch (Exception e) {
			e.printStackTrace();
		}
		////pay_tp 支付类型 1：支付宝 2：财付通 3：银联
		Map <String,String> allmap = new HashMap<String,String>();
		String orderContent  = "{}";
		String payType = "";
		
		if(type.equals( PaymentType.ALIPAY)){
			  orderContent  = this.createAliPay(  order,      notifyUrl,  returnUrl);
			  payType = "1";
		}else {
			//TODO  其他的支付类型
		}
		
		if(!StringUtils.isBlank(payType)){
			//更新订单 // 支付类型，1支付宝，2财付通，3网银  更新 支付类型
			updateOrderPayType(order.getOrderId(),NumberUtils.toInt(payType ));
		}
		
		allmap.put("orderContent", orderContent);
		allmap.put("payType", payType);
		redisGo.putMap( mainkey, allmap);
		redisGo.setExiperse(mainkey , 3600);
		
		String REDIRICT_PAY_URL =  ConfigUtil.getString( "REDIRICT_PAY_URL" ); 
		return REDIRICT_PAY_URL+""+orderid+"/"+token;
	}
	
	/**
	 * 根据前端选择  更新订单的支付  类型
	 *  Function:
	 *  功能说明： // 支付类型，1支付宝，2财付通，3网银  更新 支付类型
	 *	 使用说明：
	 *  @author  wangxiaolei  DateTime 2015年4月8日 下午2:47:50
	 *	返回类型: void    
	 *  @param orderID
	 */
	private void updateOrderPayType(String orderID,int type){
		 DrmBuyOrder orderobj= this.drmBuyOrderMapper.selectByPrimaryKey(orderID );
		  // 支付类型，1支付宝，2财付通，3网银  更新 支付类型
		  orderobj.setPayTp( type);
	}
	 
	
	private String createAliPay(DrmBuyOrder order, String notifyUrl,String returnUrl){
		
		User user = userService.getUserById(order.getUserId().toString());
		
		AliPayPramVo vo = new AliPayPramVo();
		//订单表述
		vo.body = order.getRemarkDesc();
		//客户端IP
		vo.exter_invoke_ip = "";
		
		vo.notify_url = notifyUrl;
		//商户订单号
		vo.out_trade_no=  order.getOrderId();
		//商家好吗
		vo.partner = "";
		
		vo.return_url = returnUrl;
		
		vo.subject = "账号:"+user.getLoginName()+",德瑞姆购买课程订单支付,金额:"+PriceUtils.CoinToYuan(order.getPayPrice() )+"元";
		
		//支付总额 元
		vo.total_fee = PriceUtils.CoinToYuan(order.getPayPrice() );
		//支付类型
		vo.payment_type= "1";
		
		vo.anti_phishing_key ="";
		 
		 
		return  JsonMapper.toJson(vo);
	}
	
	
	

}
